package arrays;

import java.util.Arrays;
import java.util.Queue;
import java.util.Stack;

/**
 * @Author: pengfei.hpf
 * @Date: 2020/1/23
 *
 * 给定一个包括 n 个整数的数组 nums 和 一个目标值 target。找出 nums 中的三个整数，使得它们的和与 target 最接近。返回这三个数的和。假定每组输入只存在唯一答案。
 *
 * 例如，给定数组 nums = [-1，2，1，-4], 和 target = 1.
 *
 * 与 target 最接近的三个数的和为 2. (-1 + 2 + 1 = 2).
 *
 * 来源：力扣（LeetCode）
 * 链接：https://leetcode-cn.com/problems/3sum-closest
 * 著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 */
public class ThreeSumClosest {
    long minSum = Integer.MAX_VALUE;
    public int threeSumClosest(int[] nums, int target) {

        if(nums == null || nums.length < 3){
            return 0;
        }
        backTrack(nums, target, 0, 0, 0);
        return (int)minSum;
    }

    private void backTrack(int[] nums, int target, int start, int sum, int count){

        if(start > nums.length - (3 - count)){
            return;
        }
        int c = count + 1;
        for(int i = start; i < nums.length; i ++){
            int s = sum + nums[i];
            if(c == 3){
                if(Math.abs(target - s) < Math.abs(target - minSum)){
                    minSum = s;
                }
            } else {
                backTrack(nums, target, i + 1, s, c);
            }
        }

    }

    public static void main(String[] args){

        System.out.println((new ThreeSumClosest()).threeSumClosest(new int[]{1,1,-1,-1,3}, -1));
    }


}
